package org.mcs.controlador.mantenimiento;  
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.mcs.util.MailSender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.query.Param;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.google.gson.Gson;

import emp.entidades.EntPerfil;
import emp.entidades.EntUsuario; 
import emp.jsf.servicio.PerfilService;
import emp.jsf.servicio.UsuarioService;
import emp.jsf.servicio.impl.UbigeoServiceImpl;

@Controller  
public class UsuarioController {

	@Autowired
	UsuarioService usuarioComponente;
	
	@Autowired
	PerfilService perfilService;
	
	  @RequestMapping(method=RequestMethod.GET, value="/usuario")
	   public ModelAndView carga() {
		  EntUsuario usuario=new EntUsuario();   
		  usuario.setEntPerfil(new EntPerfil());
		  ModelAndView mov= new ModelAndView("usuario-mnt", "command",usuario);
//		  mov.addObject("listaPerfil",perfilService.listarPerfil());
		  cargarDatos(mov);
		  return mov;
	   }
	  
	  
	  public void cargarDatos(ModelAndView mov){
		  mov.addObject("listaPerfil",perfilService.listarPerfil());
	  }
	  
	  @RequestMapping(method=RequestMethod.GET, value="usuario/lista") 
	   public  @ResponseBody   void lista( HttpServletResponse response  ) throws IOException { 
		  List<EntUsuario> listaUsuario=usuarioComponente.listarUsuarios();
		  for(EntUsuario u:listaUsuario){
			  EntPerfil p=new EntPerfil();
			  p.setId(u.getEntPerfil().getId());
			  u.setEntPerfil(p);
		  } 
		  	Gson gson = new Gson(); 
	  		String resultado=gson.toJson(listaUsuario);
	  		
	  		OutputStream os = response.getOutputStream();
			byte[] content =resultado.getBytes();
			os.write(content);
			response.setContentType("text/html;charset=iso-8859-1");
			response.setContentLength(content.length); 
	   }
	  
	  @RequestMapping(value = "usuario/nuevo", method = RequestMethod.POST)
	   public ModelAndView nuevo(@ModelAttribute("SpringWeb")EntUsuario usuario, ModelMap model, final RedirectAttributes redirectAttributes) {
		  ModelAndView mov=new ModelAndView("usuario-mnt", "command",new EntUsuario() );
 
		  try {
			  
			  if(usuario!=null && usuario.getNombre()!=null){
				  
				  if(usuarioComponente.obtenerUsuarioPorCodigo(usuario.getUsuLogin())!=null){
					  mov.addObject( "messageerror","Codigo de usuario ya existe. Ingresar uno diferente.");
				  }else{
						  
						  EntUsuario usuarioGrabado=usuarioComponente.crear(usuario);
					      if(usuarioGrabado.getId()==null){ 
					    	  mov.addObject( "messageerror","Error al grabar. Vuelva a intentarlo");
					      }else{
					    	  MailSender m=new MailSender();
					    	  m.enviarGmail("chavez.mario.c@gmail.com", "mlcc2305", "Generacion de clave del sistema MCS", "Estimado usuario.  Su clave generada es '"+usuario.getPassword()+"'. <br/> Se le recomienda cambiarla. <br/><br/> Saludos.", usuario.getEmail());
					      }
					      
				  }
			      
			  }
			} catch (Exception e) { 
				mov.addObject(  "messageerror","Error generico. Si el problema persiste contacte a soporte"); 
				e.printStackTrace();
			}finally{
				cargarDatos(mov);
				return mov;
			}
	   }
	  
	  
	  @RequestMapping(value = "usuario/modifica", method = RequestMethod.POST)
	   public ModelAndView modifica(@ModelAttribute("SpringWeb")EntUsuario usuario, ModelMap model, final RedirectAttributes redirectAttributes) {
		  ModelAndView mov=new ModelAndView("usuario-mnt", "command",new EntUsuario() );

		  try {
			  
			  if(usuario!=null && usuario.getNombre()!=null){
				    
						  EntUsuario usuarioGrabado=usuarioComponente.modificar(usuario);
					      if(usuarioGrabado.getId()==null){ 
					    	  mov.addObject( "messageerror","Error al grabar. Vuelva a intentarlo");
					      }
					       
			  }
			} catch (Exception e) { 
				mov.addObject(  "messageerror","Error generico. Si el problema persiste contacte a soporte"); 
				e.printStackTrace();
			}finally{
				cargarDatos(mov);
				return mov;
			}
	   }
	  
	 
	  @RequestMapping(method=RequestMethod.POST, value="usuario/eliminar") 
	   public  ModelAndView eliminar(@ModelAttribute("id")String id, ModelMap model, final RedirectAttributes redirectAttributes) {
		  ModelAndView mov=new ModelAndView("usuario-mnt", "command",new EntUsuario() );
		  try { 
			  	usuarioComponente.eliminar(id);
		  	} catch (Exception e) { 
				mov.addObject(  "messageerror","Error generico. Si el problema persiste contacte a soporte");
				e.printStackTrace();
			}
		  	cargarDatos(mov);
	  		return mov; 
	   }
	 
}
